perm filename M[MUS,LCS] blob sn#314547 filedate 1977-11-04 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00006 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	NO_MSG←1  < INHIBITS REPETITIVE MESSAGES
C00006 00003	FUNCTION SEG(ARRAY FUNC)
C00008 00004	FUNCTION SYNTH(ARRAY FUNC)
C00010 00005	<comment: type 'SETMAG nchns, srate'  
C00013 00006	<FOUR INSTRUMENTS FOR ELEMENTRY COMPUTER MUSIC (+SIMP)
C00016 ENDMK
C⊗;
NO_MSG←1;  < INHIBITS REPETITIVE MESSAGES

COMMENT: ******INITIALIZATION FILE FOR MUS10.DMP******** 10/77
***THIS IS STANFORD VERSION.

	 TO CREATE MUS10.DMP RUN COMMAND FILE, 'LMUS.CMD',
	 THEN READ IN THIS FILE BEFORE SAVING ON THE SYSTEM.

	THE FOLLOWING FUNCTIONS ARE SET UP HEREIN:
		SEG(ARRAY FUNC)
		SYNTH(ARRAY FUNC)
		POWER( N, X )   [GIVES POWER OF N TO THE XTH] ;

VARIABLE MAG,C,CF,CS,D,DF,DS,E,EF,ES,F,FF,FS,G,GF,GS,A,AF,AS,B,BF,BS;
C←261.62;  CS←DF←277.18;  D←293.66;  DS←EF←311.13;  E←FF←329.63;
F←ES←349.23;  FS←GF←369.99;  G←391.99;  GS←AF←415.31;
A←440;    AS←BF←466.16;  B←493.89; CF←B/2; BS←C*2;

EXTERNAL FUNCTION  SIND(X),
 	SIN(A), EXP(A), ALOG(A), SQRT(A), RDNUM(X);

FUNCTION SEEIT(ARRAY FUNC);  BEGIN
	VARIABLE K;	
	END;

FUNCTION SEG(ARRAY FUNC);
BEGIN
VARIABLE X512,K,A1,A2,ST,STPP,STPS,IS,IT,DIF,RK;
  A1←0; ST←0; STPP←0; X512←0;
	WHILE STPP ≤ 1 DO
		BEGIN
		 RDNUM(A2);  
		 IF A2 =512 THEN X512←A2;
		 IF A2 =512 THEN RDNUM(A2);  RDNUM(STPP);
COMMENT: TYPE 512 AT FIRST TO USE 512 STEPS INSTEAD OF 100 STEPS.;
		 IF STPP ≤ 1 THEN A1←A2;
		END;

    WHILE STPP < 999 DO   
      BEGIN  
	IS← INT(STPP*5.120+.0001);
	IF X512 > 0 THEN IS←INT(STPP+.0001);
	IF IS > 512 THEN 
 	    BEGIN   PRINT " *** SMOOTHED ";
		FOR K←0 STEP 1 UNTIL 511 DO
COMMENT: READ 512 NUMS FROM A FUNC FILE.;
  		  BEGIN
		     RDNUM(RK);  FUNC(K)← RK;
		  END;
                SEEIT(FUNC); PRINT "SEG ARRAY   "; 
		RETURN;
	    END;

	STPP ← IS-1; 		STPS ← STPP-ST;
	IS ← INT(STPS);		DIF←A2-A1;
	IT←INT(ST);		ST ← STPP;
	FOR K←0 STEP 1 UNTIL IS DO
		BEGIN
		RK ← K;
		FUNC(K+IT)  ← A1+DIF*RK/STPS; 
		END;
	IF STPP = 511 THEN BEGIN 
	    SEEIT(FUNC);PRINT "SEG ARRAY   "; END;
	IF STPP ≥ 511 THEN RETURN;
	A1←A2;  ST←STPP;
	RDNUM(A2); RDNUM(STPP);
       END;
END;
FUNCTION SYNTH(ARRAY FUNC);
BEGIN
VARIABLE K,XX,H,FAC,CON,AMP,X,XK,J;
FOR J ← 0 STEP 1 UNTIL 511 DO  BEGIN
	FUNC(J) ← 0; END;
COMMENT: CLEAR THE ARRAY;
 
RDNUM(XX); 	IF XX = 99 THEN XX ← -XX;
H ← XX; 	IF XX < 0 THEN RDNUM(H);
WHILE H < 999 DO
   BEGIN
	RDNUM(AMP); 
	X ←0; CON ←0;
	IF XX < 0 THEN 
	   BEGIN
		RDNUM(X);  RDNUM(CON);
COMMENT		X ← X * 1.42222222 +1 ; COMMENT 1.422 = 512/360 ;
		X ← X * 512/360 +1;
	   END;

	FOR J ← 0 STEP 1 UNTIL 511  DO
	   BEGIN
		XK ← SIND(X*360/512) * AMP + CON;
   COMMENT: .703125 = 360/512 ;	XK ← SIND(X*.703125) * AMP + CON ;
		IF CON ≥ 100 THEN FUNC(J) ← (XK-100)*FUNC(J) ;
		IF CON < 100 THEN FUNC(J) ← FUNC(J) + XK ;
		X ← X+H;	IF X > 512 THEN X ← X-512;
	   END;
	RDNUM(H);
    END;

X ← FUNC(0);   COMMENT: NEXT FOR NORMALIZATION;
FOR J ← 1 STEP 1 UNTIL 511  DO BEGIN H ← ABS(FUNC(J)); 
	IF X < H THEN X ← H;  END;

FOR J ← 0 STEP 1 UNTIL 511  DO  BEGIN  FUNC(J) ← FUNC(J) / X ;  END;
SEEIT(FUNC); PRINT " SYNTH ARRAY  ";	 COMMENT:********SEE(FUNC);
END;



FUNCTION POWER(X,N)=EXP(N*ALOG(X));	comment nth power of x;

<comment: type 'SETMAG; nchns, srate'  ;
FUNCTION MAGERR(X);
	BEGIN  PRINT "IMPROPER INPUT.   ";  X←0;
	  print "Type number of channels and sample rate: ";
	  END;

FUNCTION ADJRATE; BEGIN
  IF SRATE < 6400 THEN BEGIN
    IF SRATE <8 THEN SRATE ← 6400;  IF SRATE <10 THEN SRATE ← 8000;
    IF SRATE <12 THEN SRATE ← 10000;  IF SRATE <16 THEN SRATE ← 12800;  
    IF SRATE <20 THEN SRATE ← 16000;  IF SRATE <25 THEN SRATE ← 20000;
    IF SRATE <32 THEN SRATE ← 25600;  IF SRATE <40 THEN SRATE ← 32000;
    IF SRATE <50 THEN SRATE ← 40000; IF SRATE <60 THEN SRATE ← 51200;
    IF SRATE <80 THEN SRATE ← 64000; IF SRATE <100 THEN SRATE ← 80000;
    IF SRATE <120 THEN SRATE ← 102400; IF SRATE <130 THEN SRATE ← 128000;
    IF SRATE <200 THEN SRATE ← 160000; IF SRATE <220 THEN SRATE ← 204800;
    IF SRATE <260 THEN SRATE ← 256000; IF SRATE <4000 THEN SRATE ← 10000;
  	 COMMENT: YOU MAY TYPE 1 OR 12 FOR 12800, ETC. 10000=10000;
		END;  END;

Function SETMAG;
    begin
	VARIABLE X; X←0;
	WHILE X = 0 DO
		BEGIN   X←1; rdnum(nchns); rdnum(srate);
		IF NCHNS > 4  THEN  MAGERR(X);
		IF NCHNS = 3  THEN  MAGERR(X);
		IF NCHNS < 1  THEN  MAGERR(X);
		ADJRATE; 

		COMMENT: ONLY 6400, 12800, ETC. ARE ACCEPTED;
COMMENT:	IF INT(SRATE/6400+.1) } SRATE/6400 THEN MAGERR(X);
		END;

	MAG←512/srate;
	PRINT "NCHNS=",NCHNS,"  SRATE=",SRATE ;
    end;

<SRATE←12800;MAG←512/SRATE;NCHNS←1;
SETMAG; 1 12800;

<FOUR INSTRUMENTS FOR ELEMENTRY COMPUTER MUSIC (+SIMP)

INSTRUMENT SIMP;
OUTA←OUTA+ZOSCIL(P4,MAG*P3,P5);
END;

INSTRUMENT TOOT;
OSCIL[10](P4,10*MAG/P2,P5);
COSCIL(U1,P3*MAG,P6);<P6 IS TONE COLOR FOR 'TOOT'
OUTA←OUTA+U2;END;

INSTRUMENT CLAR;
OSCIL[10](P4,10*MAG/P2,P5);
COSCIL(U1,P3*MAG,P7);< P7 IS TONE COLOR FOR 'CLAR'
OUTA←OUTA+U2;END;

INSTRUMENT BRIT;
OSCIL[10](P4,10*MAG/P2,P5);
COSCIL(U1,P3*MAG,P8);< P8 IS TONE COLOR FOR 'BRIT'
OUTA←OUTA+U2;END;

INSTRUMENT BUZZ;
OSCIL[10](P4,10*MAG/P2,P5);
COSCIL(U1,P3*MAG,P9);< P9 IS TONE COLOR FOR 'BUZZ'
OUTA←OUTA+U2;END;

ARRAY F1,F2,F3,F4,F5,F6(512);
SYNTH(F1);1 1  999; < TOOT   - SINE WAVE (USED FOR SIMP ALSO)
SEG(F2);.9 6,1 11 .9 82	.7 90  0 100; < MEZZO LEGATO
SEG(F3);1 3,1 11,.4 31,.1 51,0 100; < STACCATO
SYNTH(F4);1,.5  3,.3  5,.2  7,.1  999; < CLAR
SYNTH(F5);1,.3  2,.4  3,.2  8,.2  12 .1  999; < BRIT
SEG(F6);-1,1   1,7   -1,14   -1,100; < BUZZ


OUTFILE←"TEST.SND";  <SETS UP DEFAULT OUTPUT FILE NAME. (BITS←12;)


PLAY;TOOT 0 .12 C 1000 F2 F1 F4 F5 F6 0;
CLAR .12;BRIT .24;BUZZ .36;
PLAY;SIMP 0 .5 A 1000 F1;FINISH;